🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / androidApp / src / fdroid / kotlin / org / meshtastic / app / map / MapView.kt
Displaying Raw • Download
androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt 01cd54907d62cd90913d3d071b6bc240cae365ef (01cd5490) Text, 59.35 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.app.map
Tff7b72import T7ee787android.app.Activity
Tff7b72import T7ee787android.content.Intent
Tff7b72import T7ee787androidx.activity.compose.rememberLauncherForActivityResult
Tff7b72import T7ee787androidx.activity.result.contract.ActivityResultContracts
Tff7b72import T7ee787androidx.appcompat.content.res.AppCompatResources
Tff7b72import T7ee787androidx.compose.foundation.background
Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Box
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.ColumnScope
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.Spacer
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.layout.width
Tff7b72import T7ee787androidx.compose.foundation.layout.wrapContentHeight
Tff7b72import T7ee787androidx.compose.foundation.layout.wrapContentWidth
Tff7b72import T7ee787androidx.compose.foundation.rememberScrollState
Tff7b72import T7ee787androidx.compose.foundation.verticalScroll
Tff7b72import T7ee787androidx.compose.material3.AlertDialogDefaults
Tff7b72import T7ee787androidx.compose.material3.BasicAlertDialog
Tff7b72import T7ee787androidx.compose.material3.Button
Tff7b72import T7ee787androidx.compose.material3.Card
Tff7b72import T7ee787androidx.compose.material3.Checkbox
Tff7b72import T7ee787androidx.compose.material3.DropdownMenu
Tff7b72import T7ee787androidx.compose.material3.DropdownMenuGroup
Tff7b72import T7ee787androidx.compose.material3.DropdownMenuItem
Tff7b72import T7ee787androidx.compose.material3.ExperimentalMaterial3Api
Tff7b72import T7ee787androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.MenuDefaults
Tff7b72import T7ee787androidx.compose.material3.ModalBottomSheet
Tff7b72import T7ee787androidx.compose.material3.Scaffold
Tff7b72import T7ee787androidx.compose.material3.Slider
Tff7b72import T7ee787androidx.compose.material3.Surface
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.material3.TextButton
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.DisposableEffect
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.derivedStateOf
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableDoubleStateOf
Tff7b72import T7ee787androidx.compose.runtime.mutableFloatStateOf
Tff7b72import T7ee787androidx.compose.runtime.mutableIntStateOf
Tff7b72import T7ee787androidx.compose.runtime.mutableStateListOf
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.rememberCoroutineScope
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.hapticfeedback.HapticFeedbackType
Tff7b72import T7ee787androidx.compose.ui.platform.LocalContext
Tff7b72import T7ee787androidx.compose.ui.platform.LocalDensity
Tff7b72import T7ee787androidx.compose.ui.platform.LocalHapticFeedback
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.compose.ui.viewinterop.AndroidView
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787org.jetbrains.compose.resources.StringResource
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.koin.compose.viewmodel.koinViewModel
Tff7b72import T7ee787org.meshtastic.app.R
Tff7b72import T7ee787org.meshtastic.app.map.cluster.RadiusMarkerClusterer
Tff7b72import T7ee787org.meshtastic.app.map.component.CacheLayout
Tff7b72import T7ee787org.meshtastic.app.map.component.CustomMapLayersSheet
Tff7b72import T7ee787org.meshtastic.app.map.component.DownloadButton
Tff7b72import T7ee787org.meshtastic.app.map.model.CustomTileSource
Tff7b72import T7ee787org.meshtastic.app.map.model.MarkerWithLabel
Tff7b72import T7ee787org.meshtastic.core.common.gpsDisabled
Tff7b72import T7ee787org.meshtastic.core.common.util.DateFormatter
Tff7b72import T7ee787org.meshtastic.core.common.util.nowMillis
Tff7b72import T7ee787org.meshtastic.core.common.util.nowSeconds
Tff7b72import T7ee787org.meshtastic.core.model.DataPacket
Tff7b72import T7ee787org.meshtastic.core.model.Node
Tff7b72import T7ee787org.meshtastic.core.model.NodeAddress
Tff7b72import T7ee787org.meshtastic.core.model.geofence.toGeofence
Tff7b72import T7ee787org.meshtastic.core.model.isLocked
Tff7b72import T7ee787org.meshtastic.core.model.isModifiableBy
Tff7b72import T7ee787org.meshtastic.core.model.util.toCodePointString
Tff7b72import T7ee787org.meshtastic.core.model.util.waypointIconOrDefault
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.calculating
Tff7b72import T7ee787org.meshtastic.core.resources.cancel
Tff7b72import T7ee787org.meshtastic.core.resources.clear
Tff7b72import T7ee787org.meshtastic.core.resources.close
Tff7b72import T7ee787org.meshtastic.core.resources.delete_for_everyone
Tff7b72import T7ee787org.meshtastic.core.resources.delete_for_me
Tff7b72import T7ee787org.meshtastic.core.resources.expires
Tff7b72import T7ee787org.meshtastic.core.resources.geofence
Tff7b72import T7ee787org.meshtastic.core.resources.geofence_box_author_confirm
Tff7b72import T7ee787org.meshtastic.core.resources.geofence_box_author_hint_viewport
Tff7b72import T7ee787org.meshtastic.core.resources.getString
Tff7b72import T7ee787org.meshtastic.core.resources.last_heard_filter_label
Tff7b72import T7ee787org.meshtastic.core.resources.location_disabled
Tff7b72import T7ee787org.meshtastic.core.resources.manage_map_layers
Tff7b72import T7ee787org.meshtastic.core.resources.map_cache_info
Tff7b72import T7ee787org.meshtastic.core.resources.map_cache_manager
Tff7b72import T7ee787org.meshtastic.core.resources.map_cache_size
Tff7b72import T7ee787org.meshtastic.core.resources.map_cache_tiles
Tff7b72import T7ee787org.meshtastic.core.resources.map_clear_tiles
Tff7b72import T7ee787org.meshtastic.core.resources.map_download_complete
Tff7b72import T7ee787org.meshtastic.core.resources.map_download_errors
Tff7b72import T7ee787org.meshtastic.core.resources.map_download_region
Tff7b72import T7ee787org.meshtastic.core.resources.map_node_popup_details
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_manager
Tff7b72import T7ee787org.meshtastic.core.resources.map_purge_fail
Tff7b72import T7ee787org.meshtastic.core.resources.map_purge_success
Tff7b72import T7ee787org.meshtastic.core.resources.map_style_selection
Tff7b72import T7ee787org.meshtastic.core.resources.map_subDescription
Tff7b72import T7ee787org.meshtastic.core.resources.map_tile_source
Tff7b72import T7ee787org.meshtastic.core.resources.now
Tff7b72import T7ee787org.meshtastic.core.resources.only_favorites
Tff7b72import T7ee787org.meshtastic.core.resources.show_precision_circle
Tff7b72import T7ee787org.meshtastic.core.resources.show_waypoints
Tff7b72import T7ee787org.meshtastic.core.resources.unknown
Tff7b72import T7ee787org.meshtastic.core.resources.waypoint_delete
Tff7b72import T7ee787org.meshtastic.core.resources.you
Tff7b72import T7ee787org.meshtastic.core.ui.component.BasicListItem
Tff7b72import T7ee787org.meshtastic.core.ui.component.ListItem
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Check
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Favorite
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Layers
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Lens
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Map
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MeshtasticIcons
Tff7b72import T7ee787org.meshtastic.core.ui.icon.PinDrop
Tff7b72import T7ee787org.meshtastic.core.ui.util.PermissionStatus
Tff7b72import T7ee787org.meshtastic.core.ui.util.formatAgo
Tff7b72import T7ee787org.meshtastic.core.ui.util.rememberLocationPermissionState
Tff7b72import T7ee787org.meshtastic.core.ui.util.showToast
Tff7b72import T7ee787org.meshtastic.feature.map.BaseMapViewModel.MapFilterState
Tff7b72import T7ee787org.meshtastic.feature.map.LastHeardFilter
Tff7b72import T7ee787org.meshtastic.feature.map.component.EditWaypointDialog
Tff7b72import T7ee787org.meshtastic.feature.map.component.MapButton
Tff7b72import T7ee787org.meshtastic.feature.map.component.MapControlsOverlay
Tff7b72import T7ee787org.meshtastic.feature.map.component.SitePlannerParams
Tff7b72import T7ee787org.meshtastic.feature.map.component.WaypointInfoDialog
Tff7b72import T7ee787org.meshtastic.proto.Waypoint
Tff7b72import T7ee787org.osmdroid.bonuspack.utils.BonusPackHelper.getBitmapFromVectorDrawable
Tff7b72import T7ee787org.osmdroid.config.Configuration
Tff7b72import T7ee787org.osmdroid.events.DelayedMapListener
Tff7b72import T7ee787org.osmdroid.events.MapEventsReceiver
Tff7b72import T7ee787org.osmdroid.events.MapListener
Tff7b72import T7ee787org.osmdroid.events.ScrollEvent
Tff7b72import T7ee787org.osmdroid.events.ZoomEvent
Tff7b72import T7ee787org.osmdroid.tileprovider.cachemanager.CacheManager
Tff7b72import T7ee787org.osmdroid.tileprovider.modules.SqliteArchiveTileWriter
Tff7b72import T7ee787org.osmdroid.tileprovider.tilesource.ITileSource
Tff7b72import T7ee787org.osmdroid.tileprovider.tilesource.OnlineTileSourceBase
Tff7b72import T7ee787org.osmdroid.tileprovider.tilesource.TileSourcePolicyException
Tff7b72import T7ee787org.osmdroid.util.BoundingBox
Tff7b72import T7ee787org.osmdroid.util.GeoPoint
Tff7b72import T7ee787org.osmdroid.views.MapView
Tff7b72import T7ee787org.osmdroid.views.overlay.MapEventsOverlay
Tff7b72import T7ee787org.osmdroid.views.overlay.Marker
Tff7b72import T7ee787org.osmdroid.views.overlay.Polygon
Tff7b72import T7ee787org.osmdroid.views.overlay.infowindow.InfoWindow
Tff7b72import T7ee787org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay
Tff7b72import T7ee787java.io.File
Tff7b72import T7ee787kotlin.math.roundToInt
Tff7b72import T7ee787org.meshtastic.proto.BoundingBox Tff7b72as Te6edf3ProtoBoundingBox
T8b949e/**
* Marker subclass for waypoint geofence overlays (circles + boxes). Distinguished from the tile-download / geofence
* authoring rectangle Polygons so [updateMarkers] can rebuild only the waypoint geofences on each refresh. The
* transient-rectangle cleanups in the download/authoring paths exclude this subclass (`removeAll { it is Polygon && it
* !is GeofenceOverlayPolygon }`) so persistent waypoint geofences are not wiped.
*/
Tff7b72private Tff7b72class T56d364GeofenceOverlayPolygon Tb4b4b4: Te6edf3PolygonTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72const Tff7b72val Te6edf3INITIAL_MAP_ZOOM Tff7b72= T79c0ff1.5
Tff7b72private Tff7b72fun Te6edf3MapViewTb4b4b4.Td2a8ffsaveCameraPositionTb4b4b4(Te6edf3viewModelTb4b4b4: Te6edf3MapViewModelTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3center Tff7b72= Te6edf3mapCenter
Te6edf3viewModelTb4b4b4.Te6edf3saveCameraPositionTb4b4b4(Te6edf3centerTb4b4b4.Te6edf3latitudeTb4b4b4, Te6edf3centerTb4b4b4.Te6edf3longitudeTb4b4b4, Te6edf3zoomLevelDoubleTb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Te6edf3MapViewTb4b4b4.Td2a8ffupdateMarkersTb4b4b4(
Te6edf3nodeMarkersTb4b4b4: Te6edf3ListTff7b72<Te6edf3MarkerWithLabelTff7b72>Tb4b4b4,
Te6edf3waypointMarkersTb4b4b4: Te6edf3ListTff7b72<Te6edf3MarkerWithLabelTff7b72>Tb4b4b4,
Te6edf3geofenceOverlaysTb4b4b4: Te6edf3ListTff7b72<Te6edf3GeofenceOverlayPolygonTff7b72>Tb4b4b4,
Te6edf3nodeClustererTb4b4b4: Te6edf3RadiusMarkerClustererTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffShowing on map: Tffd700${Te6edf3nodeMarkersTb4b4b4.Te6edf3sizeTffd700}Ta5d6ff nodes Tffd700${Te6edf3waypointMarkersTb4b4b4.Te6edf3sizeTffd700}Ta5d6ff waypointsTa5d6ff" Tb4b4b4}
Te6edf3overlaysTb4b4b4.Te6edf3removeAll Tb4b4b4{ Te6edf3overlay Tff7b72-Tff7b72>
Te6edf3overlay Tff7b72is Te6edf3MarkerWithLabel Tff7b72|Tff7b72|
Te6edf3overlay Tff7b72is Te6edf3GeofenceOverlayPolygon Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3overlay Tff7b72is Te6edf3Marker Tff7b72&Tff7b72& Te6edf3overlay Tff7b72!in Te6edf3nodeClustererTb4b4b4.Te6edf3itemsTb4b4b4)
Tb4b4b4}
Te6edf3overlaysTb4b4b4.Te6edf3addAllTb4b4b4(Te6edf3geofenceOverlaysTb4b4b4)
Te6edf3overlaysTb4b4b4.Te6edf3addAllTb4b4b4(Te6edf3waypointMarkersTb4b4b4)
Te6edf3nodeClustererTb4b4b4.Te6edf3itemsTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)
Te6edf3nodeClustererTb4b4b4.Te6edf3itemsTb4b4b4.Te6edf3addAllTb4b4b4(Te6edf3nodeMarkersTb4b4b4)
Te6edf3nodeClustererTb4b4b4.Te6edf3invalidateTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffcacheManagerCallbackTb4b4b4(Te6edf3onTaskCompleteTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3onTaskFailedTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tff7b72=
Tff7b72object Tb4b4b4: T56d364CacheManagerTb4b4b4.Te6edf3CacheManagerCallback Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffonTaskCompleteTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3onTaskCompleteTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72override Tff7b72fun Td2a8ffonTaskFailedTb4b4b4(Te6edf3errorsTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
Te6edf3onTaskFailedTb4b4b4(Te6edf3errorsTb4b4b4)
Tb4b4b4}
Tff7b72override Tff7b72fun Td2a8ffupdateProgressTb4b4b4(Te6edf3progressTb4b4b4: Tffa657IntTb4b4b4, Te6edf3currentZoomLevelTb4b4b4: Tffa657IntTb4b4b4, Te6edf3zoomMinTb4b4b4: Tffa657IntTb4b4b4, Te6edf3zoomMaxTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
T8b949e// NOOP since we are using the build in UI
Tb4b4b4}
Tff7b72override Tff7b72fun Td2a8ffdownloadStartedTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// NOOP since we are using the build in UI
Tb4b4b4}
Tff7b72override Tff7b72fun Td2a8ffsetPossibleTilesInAreaTb4b4b4(Te6edf3totalTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
T8b949e// NOOP since we are using the build in UI
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Main composable for displaying the map view, including nodes, waypoints, and user location. It handles user
* interactions for map manipulation, filtering, and offline caching.
*
* @param mapViewModel The [MapViewModel] providing data and state for the map.
* @param navigateToNodeDetails Callback to navigate to the details screen of a selected node.
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ApiTff7b72::Te6edf3classTb4b4b4)
Tf0883e@Composable
Tff7b72fun Td2a8ffMapViewTb4b4b4(
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3mapViewModelTb4b4b4: Te6edf3MapViewModel Tff7b72= Te6edf3koinViewModelTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3navigateToNodeDetailsTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3mapFilterExpanded Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3mapFilterState Tff7b72by Te6edf3mapViewModelTb4b4b4.Te6edf3mapFilterStateFlowTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3isConnected Tff7b72by Te6edf3mapViewModelTb4b4b4.Te6edf3isConnectedTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3cacheEstimate Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3zoomLevelMin Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableDoubleStateOfTb4b4b4(T79c0ff0.0Tb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3zoomLevelMax Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableDoubleStateOfTb4b4b4(T79c0ff0.0Tb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3downloadRegionBoundingBoxTb4b4b4: Te6edf3BoundingBox? Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3myLocationOverlayTb4b4b4: Te6edf3MyLocationNewOverlay? Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
T8b949e// Geofence box authoring: when geofenceBoxDraft is non-null the user is positioning a rectangle (reusing the
T8b949e// tile-download rectangle machinery) that becomes the draft's bounding box on confirm. Kept distinct from the
T8b949e// tile-download box (downloadRegionBoundingBox) so the two rectangle modes never collide.
Tff7b72var Te6edf3geofenceBoxDraft Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTff7b72<Te6edf3Waypoint?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3geofenceBoxBoundingBoxTb4b4b4: Te6edf3BoundingBox? Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3showDownloadButtonTb4b4b4: Tffa657Boolean Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3showEditWaypointDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTff7b72<Te6edf3Waypoint?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3showDeleteWaypointDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTff7b72<Te6edf3Waypoint?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3showGeofenceInfoDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTff7b72<Te6edf3Waypoint?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3showCacheManagerDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3showCurrentCacheInfo Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3showPurgeTileSourceDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3showMapStyleDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3scope Tff7b72= Te6edf3rememberCoroutineScopeTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3context Tff7b72= Te6edf3LocalContextTb4b4b4.Te6edf3current
Tff7b72val Te6edf3density Tff7b72= Te6edf3LocalDensityTb4b4b4.Te6edf3current
Tff7b72val Te6edf3haptic Tff7b72= Te6edf3LocalHapticFeedbackTb4b4b4.Te6edf3current
Tff7b72fun Td2a8ffperformHapticFeedbackTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3hapticTb4b4b4.Te6edf3performHapticFeedbackTb4b4b4(Te6edf3HapticFeedbackTypeTb4b4b4.Te6edf3LongPressTb4b4b4)
Tff7b72val Te6edf3unknownText Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3unknownTb4b4b4)
Tff7b72val Te6edf3nowText Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3nowTb4b4b4)
T8b949e// Location permission state (native; recomputed on resume).
Tff7b72val Te6edf3locationPermission Tff7b72= Te6edf3rememberLocationPermissionStateTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3triggerLocationToggleAfterPermission Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72fun Td2a8ffloadOnlineTileSourceBaseTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3ITileSource Tb4b4b4{
Tff7b72val Te6edf3id Tff7b72= Te6edf3mapViewModelTb4b4b4.Te6edf3mapStyleId
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffmapStyleId from prefs: Tffd700$Te6edf3idTa5d6ff" Tb4b4b4}
Tff7b72return Te6edf3CustomTileSourceTb4b4b4.Te6edf3getTileSourceTb4b4b4(Te6edf3idTb4b4b4)Tb4b4b4.Te6edf3also Tb4b4b4{
Te6edf3zoomLevelMax Tff7b72= Tffa657itTb4b4b4.Te6edf3maximumZoomLevelTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)
Te6edf3showDownloadButton Tff7b72= Tff7b72if Tb4b4b4(Tffa657it Tff7b72is Te6edf3OnlineTileSourceBaseTb4b4b4) Tffa657itTb4b4b4.Te6edf3tileSourcePolicyTb4b4b4.Te6edf3acceptsBulkDownloadTb4b4b4(Tb4b4b4) Tff7b72else Tff7b72false
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3nodes Tff7b72by Te6edf3mapViewModelTb4b4b4.Te6edf3nodesTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3initialCameraState Tff7b72by Te6edf3mapViewModelTb4b4b4.Te6edf3initialCameraStateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3initialCameraState Tff7b72is Te6edf3InitialCameraStateTb4b4b4.Te6edf3LoadingTb4b4b4) Tff7b72return
Tff7b72val Te6edf3initialCameraPosition Tff7b72= Tb4b4b4(Te6edf3initialCameraState Tff7b72as Te6edf3InitialCameraStateTb4b4b4.Te6edf3ReadyTb4b4b4)Tb4b4b4.Te6edf3position
Tff7b72val Te6edf3map Tff7b72=
Te6edf3rememberMapViewWithLifecycleTb4b4b4(
Te6edf3applicationId Tff7b72= Te6edf3mapViewModelTb4b4b4.Te6edf3applicationIdTb4b4b4,
Te6edf3zoomLevel Tff7b72= Te6edf3initialCameraPositionTff7b72?.Te6edf3zoom Tff7b72?: Te6edf3INITIAL_MAP_ZOOMTb4b4b4,
Te6edf3mapCenter Tff7b72= Te6edf3initialCameraPositionTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3GeoPointTb4b4b4(Tffa657itTb4b4b4.Te6edf3latitudeTb4b4b4, Tffa657itTb4b4b4.Te6edf3longitudeTb4b4b4) Tb4b4b4} Tff7b72?: Te6edf3GeoPointTb4b4b4(T79c0ff0.0Tb4b4b4, T79c0ff0.0Tb4b4b4)Tb4b4b4,
Te6edf3tileSource Tff7b72= Te6edf3loadOnlineTileSourceBaseTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72var Te6edf3hasAppliedInitialNodeBounds Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Te6edf3initialCameraPosition Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4}
Te6edf3LaunchedEffectTb4b4b4(Te6edf3nodesTb4b4b4, Te6edf3hasAppliedInitialNodeBoundsTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3nodePoints Tff7b72= Te6edf3nodesTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3validPosition Tff7b72!Tff7b72= Tff7b72null Tb4b4b4}Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3GeoPointTb4b4b4(Tffa657itTb4b4b4.Te6edf3latitudeTb4b4b4, Tffa657itTb4b4b4.Te6edf3longitudeTb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3hasAppliedInitialNodeBounds Tff7b72&Tff7b72& Te6edf3nodePointsTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3mapTb4b4b4.Te6edf3post Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3nodePointsTb4b4b4.Te6edf3size Tff7b72=Tff7b72= T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3mapTb4b4b4.Te6edf3controllerTb4b4b4.Te6edf3setCenterTb4b4b4(Te6edf3nodePointsTb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3mapTb4b4b4.Te6edf3controllerTb4b4b4.Te6edf3setZoomTb4b4b4(Te6edf3WAYPOINT_ZOOMTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3mapTb4b4b4.Te6edf3zoomToBoundingBoxTb4b4b4(Te6edf3BoundingBoxTb4b4b4.Te6edf3fromGeoPointsTb4b4b4(Te6edf3nodePointsTb4b4b4)Tb4b4b4, Tff7b72falseTb4b4b4)
Tb4b4b4}
Te6edf3mapTb4b4b4.Te6edf3saveCameraPositionTb4b4b4(Te6edf3mapViewModelTb4b4b4)
Tb4b4b4}
Te6edf3hasAppliedInitialNodeBounds Tff7b72= Tff7b72true
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3nodeClusterer Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3RadiusMarkerClustererTb4b4b4(Te6edf3contextTb4b4b4) Tb4b4b4}
T8b949e// --- Imported map layers (GeoJSON/KML overlays) — shared model/logic, F-Droid OSMdroid render ---
Tff7b72val Te6edf3mapLayers Tff7b72by Te6edf3mapViewModelTb4b4b4.Te6edf3mapLayersTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3layerRenderer Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3FdroidMapOverlayRendererTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3showLayersBottomSheet Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3sitePlannerInitial Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTff7b72<Te6edf3SitePlannerParams?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3ourNodeInfo Tff7b72by Te6edf3mapViewModelTb4b4b4.Te6edf3ourNodeInfoTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3channelSet Tff7b72by Te6edf3mapViewModelTb4b4b4.Te6edf3channelSetTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3filePickerLauncher Tff7b72=
Te6edf3rememberLauncherForActivityResultTb4b4b4(Te6edf3ActivityResultContractsTb4b4b4.Te6edf3StartActivityForResultTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3result Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3resultTb4b4b4.Te6edf3resultCode Tff7b72=Tff7b72= Te6edf3ActivityTb4b4b4.Te6edf3RESULT_OKTb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3dataTff7b72?.Te6edf3dataTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3uri Tff7b72-Tff7b72> Te6edf3mapViewModelTb4b4b4.Te6edf3addMapLayerTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3uriTb4b4b4.Te6edf3getFileNameTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3onAddLayerClicked Tff7b72= Tb4b4b4{
Tff7b72val Te6edf3intent Tff7b72=
Te6edf3IntentTb4b4b4(Te6edf3IntentTb4b4b4.Te6edf3ACTION_OPEN_DOCUMENTTb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3addCategoryTb4b4b4(Te6edf3IntentTb4b4b4.Te6edf3CATEGORY_OPENABLETb4b4b4)
Te6edf3type Tff7b72= Ta5d6ff"Ta5d6ff*/*Ta5d6ff"
Te6edf3putExtraTb4b4b4(
Te6edf3IntentTb4b4b4.Te6edf3EXTRA_MIME_TYPESTb4b4b4,
Te6edf3arrayOfTb4b4b4(
Ta5d6ff"Ta5d6ffapplication/vnd.google-earth.kml+xmlTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffapplication/vnd.google-earth.kmzTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffapplication/vnd.geo+jsonTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffapplication/geo+jsonTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffapplication/jsonTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3filePickerLauncherTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3intentTb4b4b4)
Tb4b4b4}
T8b949e// Draw imported layers on the OSMdroid map, reconciling whenever the list changes; strip them on dispose (the
T8b949e// MapView is kept alive by setDestroyMode(false), so leftover overlays would otherwise persist).
Te6edf3LaunchedEffectTb4b4b4(Te6edf3mapLayersTb4b4b4) Tb4b4b4{ Te6edf3layerRendererTb4b4b4.Te6edf3reconcileTb4b4b4(Te6edf3mapTb4b4b4, Te6edf3mapLayersTb4b4b4, Te6edf3mapViewModelTff7b72::Te6edf3getInputStreamFromUriTb4b4b4) Tb4b4b4}
Te6edf3DisposableEffectTb4b4b4(Tffa657UnitTb4b4b4) Tb4b4b4{ Te6edf3onDispose Tb4b4b4{ Te6edf3layerRendererTb4b4b4.Te6edf3removeAllTb4b4b4(Te6edf3mapTb4b4b4) Tb4b4b4} Tb4b4b4}
Tff7b72fun Te6edf3MapViewTb4b4b4.Td2a8fftoggleMyLocationTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3contextTb4b4b4.Te6edf3gpsDisabledTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffTelling user we need location turned on for MyLocationNewOverlayTa5d6ff" Tb4b4b4}
Te6edf3scopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3contextTb4b4b4.Te6edf3showToastTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3location_disabledTb4b4b4) Tb4b4b4}
Tff7b72return
Tb4b4b4}
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffuser clicked MyLocationNewOverlay Tffd700${Te6edf3myLocationOverlay Tff7b72=Tff7b72= Tff7b72nullTffd700}Ta5d6ff" Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3myLocationOverlay Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3myLocationOverlay Tff7b72=
Te6edf3MyLocationNewOverlayTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3enableMyLocationTb4b4b4(Tb4b4b4)
Te6edf3enableFollowLocationTb4b4b4(Tb4b4b4)
Te6edf3getBitmapFromVectorDrawableTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3RTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3ic_map_location_dotTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{
Te6edf3setPersonIconTb4b4b4(Tffa657itTb4b4b4)
Te6edf3setPersonAnchorTb4b4b4(T79c0ff0.5fTb4b4b4, T79c0ff0.5fTb4b4b4)
Tb4b4b4}
Te6edf3getBitmapFromVectorDrawableTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3RTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3ic_map_navigationTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{
Te6edf3setDirectionIconTb4b4b4(Tffa657itTb4b4b4)
Te6edf3setDirectionAnchorTb4b4b4(T79c0ff0.5fTb4b4b4, T79c0ff0.5fTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3overlaysTb4b4b4.Te6edf3addTb4b4b4(Te6edf3myLocationOverlayTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3myLocationOverlayTff7b72?.Te6edf3apply Tb4b4b4{
Te6edf3disableMyLocationTb4b4b4(Tb4b4b4)
Te6edf3disableFollowLocationTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3overlaysTb4b4b4.Te6edf3removeTb4b4b4(Te6edf3myLocationOverlayTb4b4b4)
Te6edf3myLocationOverlay Tff7b72= Tff7b72null
Tb4b4b4}
Tb4b4b4}
T8b949e// Effect to toggle MyLocation after permission is granted
Te6edf3LaunchedEffectTb4b4b4(Te6edf3locationPermissionTb4b4b4.Te6edf3isGrantedTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3locationPermissionTb4b4b4.Te6edf3isGranted Tff7b72&Tff7b72& Te6edf3triggerLocationToggleAfterPermissionTb4b4b4) Tb4b4b4{
Te6edf3mapTb4b4b4.Te6edf3toggleMyLocationTb4b4b4(Tb4b4b4)
Te6edf3triggerLocationToggleAfterPermission Tff7b72= Tff7b72false
Tb4b4b4}
Tb4b4b4}
T8b949e// Keep screen on while location tracking is active
Te6edf3LaunchedEffectTb4b4b4(Te6edf3myLocationOverlayTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3activity Tff7b72= Te6edf3context Tff7b72as? Te6edf3androidTb4b4b4.Te6edf3appTb4b4b4.Te6edf3Activity Tff7b72?: Tff7b72returnTf0883e@LaunchedEffect
Tff7b72if Tb4b4b4(Te6edf3myLocationOverlay Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3activityTb4b4b4.Te6edf3windowTb4b4b4.Te6edf3addFlagsTb4b4b4(Te6edf3androidTb4b4b4.Te6edf3viewTb4b4b4.Te6edf3WindowManagerTb4b4b4.Te6edf3LayoutParamsTb4b4b4.Te6edf3FLAG_KEEP_SCREEN_ONTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3activityTb4b4b4.Te6edf3windowTb4b4b4.Te6edf3clearFlagsTb4b4b4(Te6edf3androidTb4b4b4.Te6edf3viewTb4b4b4.Te6edf3WindowManagerTb4b4b4.Te6edf3LayoutParamsTb4b4b4.Te6edf3FLAG_KEEP_SCREEN_ONTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3waypoints Tff7b72by Te6edf3mapViewModelTb4b4b4.Te6edf3waypointsTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Te6edf3emptyMapTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3selectedWaypointId Tff7b72by Te6edf3mapViewModelTb4b4b4.Te6edf3selectedWaypointIdTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3myId Tff7b72by Te6edf3mapViewModelTb4b4b4.Te6edf3myIdTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3displayUnits Tff7b72by Te6edf3mapViewModelTb4b4b4.Te6edf3displayUnitsTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Te6edf3LaunchedEffectTb4b4b4(Te6edf3selectedWaypointIdTb4b4b4, Te6edf3waypointsTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3selectedWaypointId Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3waypointsTb4b4b4.Te6edf3containsKeyTb4b4b4(Te6edf3selectedWaypointIdTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3waypointsTff7b72[Te6edf3selectedWaypointIdTff7b72]Tff7b72?.Te6edf3waypointTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3pt Tff7b72-Tff7b72>
Tff7b72val Te6edf3geoPoint Tff7b72= Te6edf3GeoPointTb4b4b4(Tb4b4b4(Te6edf3ptTb4b4b4.Te6edf3latitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72* T79c0ff1e-7Tb4b4b4, Tb4b4b4(Te6edf3ptTb4b4b4.Te6edf3longitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72* T79c0ff1e-7Tb4b4b4)
Te6edf3mapTb4b4b4.Te6edf3controllerTb4b4b4.Te6edf3setCenterTb4b4b4(Te6edf3geoPointTb4b4b4)
Te6edf3mapTb4b4b4.Te6edf3controllerTb4b4b4.Te6edf3setZoomTb4b4b4(Te6edf3WAYPOINT_ZOOMTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3markerIcon Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3AppCompatResourcesTb4b4b4.Te6edf3getDrawableTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3RTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3ic_location_onTb4b4b4) Tb4b4b4}
Tff7b72fun Te6edf3MapViewTb4b4b4.Td2a8ffonNodesChangedTb4b4b4(Te6edf3nodesTb4b4b4: Te6edf3CollectionTff7b72<Te6edf3NodeTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3MarkerWithLabelTff7b72> Tb4b4b4{
Tff7b72val Te6edf3nodesWithPosition Tff7b72= Te6edf3nodesTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3validPosition Tff7b72!Tff7b72= Tff7b72null Tb4b4b4}
Tff7b72val Te6edf3ourNode Tff7b72= Te6edf3mapViewModelTb4b4b4.Te6edf3ourNodeInfoTb4b4b4.Te6edf3value
Tff7b72val Te6edf3mapFilterStateValue Tff7b72= Te6edf3mapViewModelTb4b4b4.Te6edf3mapFilterStateFlowTb4b4b4.Te6edf3value T8b949e// Access mapFilterState directly
Tff7b72return Te6edf3nodesWithPositionTb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3node Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3mapFilterStateValueTb4b4b4.Te6edf3onlyFavorites Tff7b72&Tff7b72& Tff7b72!Te6edf3nodeTb4b4b4.Te6edf3isFavorite Tff7b72&Tff7b72& Tff7b72!Te6edf3nodeTb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3ourNodeTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72returnTf0883e@mapNotNull Tff7b72null
Tb4b4b4}
Tff7b72if Tb4b4b4(
Te6edf3mapFilterStateValueTb4b4b4.Te6edf3lastHeardFilterTb4b4b4.Te6edf3seconds Tff7b72!Tff7b72= T79c0ff0L Tff7b72&Tff7b72&
Tb4b4b4(Te6edf3nowSeconds Tff7b72- Te6edf3nodeTb4b4b4.Te6edf3lastHeardTb4b4b4) Tff7b72> Te6edf3mapFilterStateValueTb4b4b4.Te6edf3lastHeardFilterTb4b4b4.Te6edf3seconds Tff7b72&Tff7b72&
Te6edf3nodeTb4b4b4.Te6edf3num Tff7b72!Tff7b72= Te6edf3ourNodeTff7b72?.Te6edf3num
Tb4b4b4) Tb4b4b4{
Tff7b72returnTf0883e@mapNotNull Tff7b72null
Tb4b4b4}
Tff7b72val Tb4b4b4(Te6edf3pTb4b4b4, Te6edf3uTb4b4b4) Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3position Te6edf3to Te6edf3nodeTb4b4b4.Te6edf3user
Tff7b72val Te6edf3nodePosition Tff7b72= Te6edf3GeoPointTb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3latitudeTb4b4b4, Te6edf3nodeTb4b4b4.Te6edf3longitudeTb4b4b4)
Te6edf3MarkerWithLabelTb4b4b4(Te6edf3mapView Tff7b72= Tff7b72thisTb4b4b4, Te6edf3label Tff7b72= Ta5d6ff"Tffd700${Te6edf3uTb4b4b4.Te6edf3short_nameTffd700}Ta5d6ff Tffd700${Te6edf3formatAgoTb4b4b4(Te6edf3pTb4b4b4.Te6edf3timeTb4b4b4, Te6edf3unknownTextTb4b4b4, Te6edf3nowTextTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3id Tff7b72= Te6edf3uTb4b4b4.Te6edf3id
Te6edf3title Tff7b72= Te6edf3uTb4b4b4.Te6edf3long_name
Te6edf3snippet Tff7b72=
Te6edf3getStringTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_node_popup_detailsTb4b4b4,
Te6edf3nodeTb4b4b4.Te6edf3gpsStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3formatAgoTb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3lastHeardTb4b4b4, Te6edf3unknownTextTb4b4b4, Te6edf3nowTextTb4b4b4)Tb4b4b4,
Te6edf3formatAgoTb4b4b4(Te6edf3pTb4b4b4.Te6edf3timeTb4b4b4, Te6edf3unknownTextTb4b4b4, Te6edf3nowTextTb4b4b4)Tb4b4b4,
Tff7b72if Tb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3batteryStr Tff7b72!Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4) Te6edf3nodeTb4b4b4.Te6edf3batteryStr Tff7b72else Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3ourNodeTff7b72?.Te6edf3distanceStrTb4b4b4(Te6edf3nodeTb4b4b4, Te6edf3displayUnitsTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3dist Tff7b72-Tff7b72>
Te6edf3ourNodeTb4b4b4.Te6edf3bearingTb4b4b4(Te6edf3nodeTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3bearing Tff7b72-Tff7b72>
Te6edf3subDescription Tff7b72= Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_subDescriptionTb4b4b4, Te6edf3bearingTb4b4b4, Te6edf3distTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3setAnchorTb4b4b4(Te6edf3MarkerTb4b4b4.Te6edf3ANCHOR_CENTERTb4b4b4, Te6edf3MarkerTb4b4b4.Te6edf3ANCHOR_BOTTOMTb4b4b4)
Te6edf3position Tff7b72= Te6edf3nodePosition
Te6edf3icon Tff7b72= Te6edf3markerIcon
Te6edf3setNodeColorsTb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3colorsTb4b4b4)
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3mapFilterStateValueTb4b4b4.Te6edf3showPrecisionCircleTb4b4b4) Tb4b4b4{
Te6edf3setPrecisionBitsTb4b4b4(T79c0ff0Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3setPrecisionBitsTb4b4b4(Te6edf3pTb4b4b4.Te6edf3precision_bitsTb4b4b4)
Tb4b4b4}
Te6edf3setOnLongClickListener Tb4b4b4{
Te6edf3navigateToNodeDetailsTb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3numTb4b4b4)
Tff7b72true
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffshowMarkerLongPressDialogTb4b4b4(Te6edf3idTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
Te6edf3performHapticFeedbackTb4b4b4(Tb4b4b4)
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffmarker long pressed id=Tffd700$Te6edf3idTa5d6ff" Tb4b4b4}
Tff7b72val Te6edf3waypoint Tff7b72= Te6edf3waypointsTff7b72[Te6edf3idTff7b72]Tff7b72?.Te6edf3waypoint Tff7b72?: Tff7b72return
Tff7b72when Tb4b4b4{
T8b949e// Foreign geofences: read-only view hosting the receiver-local crossing-alert opt-in.
Te6edf3waypointTb4b4b4.Te6edf3toGeofenceTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Tff7b72!Te6edf3mapViewModelTb4b4b4.Te6edf3isMyWaypointTb4b4b4(Te6edf3idTb4b4b4) Tff7b72-Tff7b72> Te6edf3showGeofenceInfoDialog Tff7b72= Te6edf3waypoint
T8b949e// edit only when unlocked or locked to us
Te6edf3waypointTb4b4b4.Te6edf3isModifiableByTb4b4b4(Te6edf3mapViewModelTb4b4b4.Te6edf3myNodeNumTb4b4b4) Tff7b72&Tff7b72& Te6edf3isConnected Tff7b72-Tff7b72> Te6edf3showEditWaypointDialog Tff7b72= Te6edf3waypoint
Tff7b72else Tff7b72-Tff7b72> Te6edf3showDeleteWaypointDialog Tff7b72= Te6edf3waypoint
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffgetUsernameTb4b4b4(Te6edf3idTb4b4b4: Tffa657String?Tb4b4b4) Tff7b72= Tff7b72if Tb4b4b4(Te6edf3id Tff7b72=Tff7b72= Te6edf3NodeAddressTb4b4b4.Te6edf3ID_LOCAL Tff7b72|Tff7b72| Tb4b4b4(Te6edf3myId Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3id Tff7b72=Tff7b72= Te6edf3myIdTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3youTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3mapViewModelTb4b4b4.Te6edf3getUserTb4b4b4(Te6edf3idTb4b4b4)Tb4b4b4.Te6edf3long_name
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72fun Te6edf3MapViewTb4b4b4.Td2a8ffonWaypointChangedTb4b4b4(Te6edf3waypointsTb4b4b4: Te6edf3CollectionTff7b72<Te6edf3DataPacketTff7b72>Tb4b4b4, Te6edf3selectedWaypointIdTb4b4b4: Tffa657Int?Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3MarkerWithLabelTff7b72> Tb4b4b4{
Tff7b72return Te6edf3waypointsTb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3waypoint Tff7b72-Tff7b72>
Tff7b72val Te6edf3pt Tff7b72= Te6edf3waypointTb4b4b4.Te6edf3waypoint Tff7b72?: Tff7b72returnTf0883e@mapNotNull Tff7b72null
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3mapFilterStateTb4b4b4.Te6edf3showWaypointsTb4b4b4) Tff7b72returnTf0883e@mapNotNull Tff7b72null T8b949e// Use collected mapFilterState
Tff7b72val Te6edf3lock Tff7b72= Tff7b72if Tb4b4b4(Te6edf3ptTb4b4b4.Te6edf3isLockedTb4b4b4) Ta5d6ff"Ta5d6ff\Ta5d6ffuD83DTa5d6ff\Ta5d6ffuDD12Ta5d6ff" Tff7b72else Ta5d6ff"Ta5d6ff"
Tff7b72val Te6edf3time Tff7b72= Te6edf3DateFormatterTb4b4b4.Te6edf3formatDateTimeTb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3timeTb4b4b4)
Tff7b72val Te6edf3label Tff7b72= Te6edf3ptTb4b4b4.Te6edf3name Tff7b72+ Ta5d6ff"Ta5d6ff Ta5d6ff" Tff7b72+ Te6edf3formatAgoTb4b4b4(Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3time Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3unknownTextTb4b4b4, Te6edf3nowTextTb4b4b4)
T8b949e// pt.icon is untrusted input; toCodePointString substitutes a fallback rather than throwing.
Tff7b72val Te6edf3emoji Tff7b72= Te6edf3ptTb4b4b4.Te6edf3iconTb4b4b4.Te6edf3waypointIconOrDefaultTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toCodePointStringTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3now Tff7b72= Te6edf3nowMillis
Tff7b72val Te6edf3expireTimeMillis Tff7b72= Te6edf3ptTb4b4b4.Te6edf3expire Tff7b72* T79c0ff1T79c0ff0T79c0ff0T79c0ff0L
Tff7b72val Te6edf3expireTimeStr Tff7b72=
Tff7b72when Tb4b4b4{
Te6edf3ptTb4b4b4.Te6edf3expire Tff7b72=Tff7b72= T79c0ff0 Tff7b72|Tff7b72| Te6edf3ptTb4b4b4.Te6edf3expire Tff7b72=Tff7b72= Tffa657IntTb4b4b4.Te6edf3MAX_VALUE Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ffNeverTa5d6ff"
Te6edf3expireTimeMillis Tff7b72<Tff7b72= Te6edf3now Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ffExpiredTa5d6ff"
Tff7b72else Tff7b72-Tff7b72> Te6edf3DateFormatterTb4b4b4.Te6edf3formatRelativeTimeTb4b4b4(Te6edf3expireTimeMillisTb4b4b4)
Tb4b4b4}
T8b949e// Non-visual cue: the geofence is otherwise only an orange overlay, so surface it in the marker's
T8b949e// accessible title for screen-reader and color-challenged users.
Tff7b72val Te6edf3geofenceLabel Tff7b72= Tff7b72if Tb4b4b4(Te6edf3ptTb4b4b4.Te6edf3toGeofenceTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Ta5d6ff"Ta5d6ff · Ta5d6ff" Tff7b72+ Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3geofenceTb4b4b4) Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3MarkerWithLabelTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3labelTb4b4b4, Te6edf3emojiTb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3id Tff7b72= Ta5d6ff"Tffd700${Te6edf3ptTb4b4b4.Te6edf3idTffd700}Ta5d6ff"
Te6edf3title Tff7b72= Ta5d6ff"Tffd700${Te6edf3ptTb4b4b4.Te6edf3nameTffd700}Ta5d6ff (Tffd700${Te6edf3getUsernameTb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3fromTb4b4b4)Tffd700}Tffd700$Te6edf3lockTa5d6ff)Tffd700$Te6edf3geofenceLabelTa5d6ff"
Te6edf3snippet Tff7b72= Ta5d6ff"Ta5d6ff[Tffd700$Te6edf3timeTa5d6ff] Tffd700${Te6edf3ptTb4b4b4.Te6edf3descriptionTffd700}Ta5d6ff Ta5d6ff" Tff7b72+ Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3expiresTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff: Tffd700$Te6edf3expireTimeStrTa5d6ff"
Te6edf3position Tff7b72= Te6edf3GeoPointTb4b4b4(Tb4b4b4(Te6edf3ptTb4b4b4.Te6edf3latitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72* T79c0ff1e-7Tb4b4b4, Tb4b4b4(Te6edf3ptTb4b4b4.Te6edf3longitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72* T79c0ff1e-7Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3selectedWaypointId Tff7b72=Tff7b72= Te6edf3ptTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3showInfoWindowTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3setOnLongClickListener Tb4b4b4{
Te6edf3showMarkerLongPressDialogTb4b4b4(Te6edf3ptTb4b4b4.Te6edf3idTb4b4b4)
Tff7b72true
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// Builds the orange geofence overlays (a circle for a radius geofence, a 4-point rect for a bounding box) for every
T8b949e// displayed waypoint. Uses the shared toGeofence() decoder so the coordinate math stays in one place.
Tff7b72fun Td2a8ffbuildGeofenceOverlaysTb4b4b4(Te6edf3waypointsTb4b4b4: Te6edf3CollectionTff7b72<Te6edf3DataPacketTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3GeofenceOverlayPolygonTff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3mapFilterStateTb4b4b4.Te6edf3showWaypointsTb4b4b4) Tff7b72return Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3waypointsTb4b4b4.Te6edf3flatMap Tb4b4b4{ Te6edf3packet Tff7b72-Tff7b72>
Tff7b72val Te6edf3pt Tff7b72= Te6edf3packetTb4b4b4.Te6edf3waypoint Tff7b72?: Tff7b72returnTf0883e@flatMap Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3geofence Tff7b72= Te6edf3ptTb4b4b4.Te6edf3toGeofenceTb4b4b4(Tb4b4b4) Tff7b72?: Tff7b72returnTf0883e@flatMap Te6edf3emptyListTb4b4b4(Tb4b4b4)
Te6edf3buildList Tb4b4b4{
Te6edf3geofenceTb4b4b4.Te6edf3circleTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3circle Tff7b72-Tff7b72>
Te6edf3addTb4b4b4(
Te6edf3GeofenceOverlayPolygonTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3points Tff7b72=
Te6edf3PolygonTb4b4b4.Te6edf3pointsAsCircleTb4b4b4(
Te6edf3GeoPointTb4b4b4(Te6edf3circleTb4b4b4.Te6edf3centerLatTb4b4b4, Te6edf3circleTb4b4b4.Te6edf3centerLonTb4b4b4)Tb4b4b4,
Te6edf3circleTb4b4b4.Te6edf3radiusMetersTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3outlinePaintTb4b4b4.Te6edf3color Tff7b72= Te6edf3GEOFENCE_OVERLAY_COLOR
Te6edf3outlinePaintTb4b4b4.Te6edf3strokeWidth Tff7b72= Te6edf3GEOFENCE_STROKE_WIDTH_PX
Te6edf3fillPaintTb4b4b4.Te6edf3color Tff7b72= Te6edf3GEOFENCE_FILL_COLOR
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3geofenceTb4b4b4.Te6edf3boxTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3box Tff7b72-Tff7b72>
Te6edf3addTb4b4b4(
Te6edf3GeofenceOverlayPolygonTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3points Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3GeoPointTb4b4b4(Te6edf3boxTb4b4b4.Te6edf3southTb4b4b4, Te6edf3boxTb4b4b4.Te6edf3westTb4b4b4)Tb4b4b4,
Te6edf3GeoPointTb4b4b4(Te6edf3boxTb4b4b4.Te6edf3northTb4b4b4, Te6edf3boxTb4b4b4.Te6edf3westTb4b4b4)Tb4b4b4,
Te6edf3GeoPointTb4b4b4(Te6edf3boxTb4b4b4.Te6edf3northTb4b4b4, Te6edf3boxTb4b4b4.Te6edf3eastTb4b4b4)Tb4b4b4,
Te6edf3GeoPointTb4b4b4(Te6edf3boxTb4b4b4.Te6edf3southTb4b4b4, Te6edf3boxTb4b4b4.Te6edf3eastTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3outlinePaintTb4b4b4.Te6edf3color Tff7b72= Te6edf3GEOFENCE_OVERLAY_COLOR
Te6edf3outlinePaintTb4b4b4.Te6edf3strokeWidth Tff7b72= Te6edf3GEOFENCE_STROKE_WIDTH_PX
Te6edf3fillPaintTb4b4b4.Te6edf3color Tff7b72= Te6edf3GEOFENCE_FILL_COLOR
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3mapEventsReceiver Tff7b72=
Tff7b72object Tb4b4b4: T56d364MapEventsReceiver Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffsingleTapConfirmedHelperTb4b4b4(Te6edf3pTb4b4b4: Te6edf3GeoPointTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Te6edf3InfoWindowTb4b4b4.Te6edf3closeAllInfoWindowsOnTb4b4b4(Te6edf3mapTb4b4b4)
Tff7b72return Tff7b72true
Tb4b4b4}
Tff7b72override Tff7b72fun Td2a8fflongPressHelperTb4b4b4(Te6edf3pTb4b4b4: Te6edf3GeoPointTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Te6edf3performHapticFeedbackTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3enabled Tff7b72= Te6edf3isConnected Tff7b72&Tff7b72& Te6edf3downloadRegionBoundingBox Tff7b72=Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3geofenceBoxDraft Tff7b72=Tff7b72= Tff7b72null
Tff7b72if Tb4b4b4(Te6edf3enabledTb4b4b4) Tb4b4b4{
Te6edf3showEditWaypointDialog Tff7b72=
Te6edf3WaypointTb4b4b4(Te6edf3latitude_i Tff7b72= Tb4b4b4(Te6edf3pTb4b4b4.Te6edf3latitude Tff7b72* T79c0ff1Te6edf3e7Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3longitude_i Tff7b72= Tb4b4b4(Te6edf3pTb4b4b4.Te6edf3longitude Tff7b72* T79c0ff1Te6edf3e7Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72return Tff7b72true
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Te6edf3MapViewTb4b4b4.Td2a8ffdrawOverlaysTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3overlaysTb4b4b4.Te6edf3none Tb4b4b4{ Tffa657it Tff7b72is Te6edf3MapEventsOverlay Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3overlaysTb4b4b4.Te6edf3addTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3MapEventsOverlayTb4b4b4(Te6edf3mapEventsReceiverTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3myLocationOverlay Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3overlaysTb4b4b4.Te6edf3none Tb4b4b4{ Tffa657it Tff7b72is Te6edf3MyLocationNewOverlay Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3overlaysTb4b4b4.Te6edf3addTb4b4b4(Te6edf3myLocationOverlayTb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3overlaysTb4b4b4.Te6edf3none Tb4b4b4{ Tffa657it Tff7b72is Te6edf3RadiusMarkerClusterer Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3overlaysTb4b4b4.Te6edf3addTb4b4b4(Te6edf3nodeClustererTb4b4b4)
Tb4b4b4}
Te6edf3addCopyrightTb4b4b4(Tb4b4b4)
Te6edf3addScaleBarOverlayTb4b4b4(Te6edf3densityTb4b4b4)
Te6edf3createLatLongGridTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3invalidateTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72fun Te6edf3MapViewTb4b4b4.Td2a8ffgenerateBoxOverlayTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3overlaysTb4b4b4.Te6edf3removeAll Tb4b4b4{ Tffa657it Tff7b72is Te6edf3Polygon Tff7b72&Tff7b72& Tffa657it Tff7b72!is Te6edf3GeofenceOverlayPolygon Tb4b4b4}
Tff7b72val Te6edf3zoomFactor Tff7b72= T79c0ff1.3
Te6edf3zoomLevelMin Tff7b72= Te6edf3minOfTb4b4b4(Te6edf3zoomLevelDoubleTb4b4b4, Te6edf3zoomLevelMaxTb4b4b4)
Te6edf3downloadRegionBoundingBox Tff7b72= Te6edf3boundingBoxTb4b4b4.Te6edf3zoomInTb4b4b4(Te6edf3zoomFactorTb4b4b4)
Tff7b72val Te6edf3polygon Tff7b72=
Te6edf3PolygonTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3points Tff7b72= Te6edf3PolygonTb4b4b4.Te6edf3pointsAsRectTb4b4b4(Te6edf3downloadRegionBoundingBoxTb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3GeoPointTb4b4b4(Tffa657itTb4b4b4.Te6edf3latitudeTb4b4b4, Tffa657itTb4b4b4.Te6edf3longitudeTb4b4b4) Tb4b4b4}
Tb4b4b4}
Te6edf3overlaysTb4b4b4.Te6edf3addTb4b4b4(Te6edf3polygonTb4b4b4)
Te6edf3invalidateTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3tileCountTb4b4b4: Tffa657Int Tff7b72=
Te6edf3CacheManagerTb4b4b4(Tff7b72thisTb4b4b4)
Tb4b4b4.Te6edf3possibleTilesInAreaTb4b4b4(Te6edf3downloadRegionBoundingBoxTb4b4b4, Te6edf3zoomLevelMinTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3zoomLevelMaxTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3cacheEstimate Tff7b72= Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_cache_tilesTb4b4b4, Te6edf3tileCountTb4b4b4)
Tb4b4b4}
T8b949e// Positions the geofence rectangle from the current viewport (reusing the tile-download rectangle approach) and
T8b949e// draws an orange preview Polygon. Mirrors generateBoxOverlay(), but stores into geofenceBoxBoundingBox so it
T8b949e// never collides with the tile-download box.
Tff7b72fun Te6edf3MapViewTb4b4b4.Td2a8ffgenerateGeofenceBoxOverlayTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3overlaysTb4b4b4.Te6edf3removeAll Tb4b4b4{ Tffa657it Tff7b72is Te6edf3Polygon Tff7b72&Tff7b72& Tffa657it Tff7b72!is Te6edf3GeofenceOverlayPolygon Tb4b4b4}
Te6edf3geofenceBoxBoundingBox Tff7b72= Te6edf3boundingBoxTb4b4b4.Te6edf3zoomInTb4b4b4(Te6edf3GEOFENCE_BOX_ZOOM_FACTORTb4b4b4)
Tff7b72val Te6edf3polygon Tff7b72=
Te6edf3PolygonTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3points Tff7b72= Te6edf3PolygonTb4b4b4.Te6edf3pointsAsRectTb4b4b4(Te6edf3geofenceBoxBoundingBoxTb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3GeoPointTb4b4b4(Tffa657itTb4b4b4.Te6edf3latitudeTb4b4b4, Tffa657itTb4b4b4.Te6edf3longitudeTb4b4b4) Tb4b4b4}
Te6edf3outlinePaintTb4b4b4.Te6edf3color Tff7b72= Te6edf3GEOFENCE_OVERLAY_COLOR
Te6edf3outlinePaintTb4b4b4.Te6edf3strokeWidth Tff7b72= Te6edf3GEOFENCE_STROKE_WIDTH_PX
Te6edf3fillPaintTb4b4b4.Te6edf3color Tff7b72= Te6edf3GEOFENCE_FILL_COLOR
Tb4b4b4}
Te6edf3overlaysTb4b4b4.Te6edf3addTb4b4b4(Te6edf3polygonTb4b4b4)
Te6edf3invalidateTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3cameraSaveListener Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3mapViewModelTb4b4b4) Tb4b4b4{
Te6edf3DelayedMapListenerTb4b4b4(
Tff7b72object Tb4b4b4: T56d364MapListener Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffonScrollTb4b4b4(Te6edf3eventTb4b4b4: Te6edf3ScrollEventTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Te6edf3eventTb4b4b4.Te6edf3sourceTb4b4b4.Te6edf3saveCameraPositionTb4b4b4(Te6edf3mapViewModelTb4b4b4)
Tff7b72return Tff7b72true
Tb4b4b4}
Tff7b72override Tff7b72fun Td2a8ffonZoomTb4b4b4(Te6edf3eventTb4b4b4: Te6edf3ZoomEventTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Te6edf3eventTb4b4b4.Te6edf3sourceTb4b4b4.Te6edf3saveCameraPositionTb4b4b4(Te6edf3mapViewModelTb4b4b4)
Tff7b72return Tff7b72true
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3boxOverlayListener Tff7b72=
Tff7b72object Tb4b4b4: T56d364MapListener Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffonScrollTb4b4b4(Te6edf3eventTb4b4b4: Te6edf3ScrollEventTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Te6edf3cameraSaveListenerTb4b4b4.Te6edf3onScrollTb4b4b4(Te6edf3eventTb4b4b4)
Tff7b72when Tb4b4b4{
Te6edf3downloadRegionBoundingBox Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72> Te6edf3eventTb4b4b4.Te6edf3sourceTb4b4b4.Te6edf3generateBoxOverlayTb4b4b4(Tb4b4b4)
Te6edf3geofenceBoxDraft Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72> Te6edf3eventTb4b4b4.Te6edf3sourceTb4b4b4.Te6edf3generateGeofenceBoxOverlayTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72return Tff7b72true
Tb4b4b4}
Tff7b72override Tff7b72fun Td2a8ffonZoomTb4b4b4(Te6edf3eventTb4b4b4: Te6edf3ZoomEventTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Te6edf3cameraSaveListenerTb4b4b4.Te6edf3onZoomTb4b4b4(Te6edf3eventTb4b4b4)
Tff7b72return Tff7b72false
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffstartDownloadTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3boundingBox Tff7b72= Te6edf3downloadRegionBoundingBox Tff7b72?: Tff7b72return
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3outputName Tff7b72= Te6edf3buildString Tb4b4b4{
Te6edf3appendTb4b4b4(Te6edf3ConfigurationTb4b4b4.Te6edf3getInstanceTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3osmdroidBasePathTb4b4b4.Te6edf3absolutePathTb4b4b4)
Te6edf3appendTb4b4b4(Te6edf3FileTb4b4b4.Te6edf3separatorTb4b4b4)
Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ffmainFile.sqliteTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3writer Tff7b72= Te6edf3SqliteArchiveTileWriterTb4b4b4(Te6edf3outputNameTb4b4b4)
Tff7b72val Te6edf3cacheManager Tff7b72= Te6edf3CacheManagerTb4b4b4(Te6edf3mapTb4b4b4, Te6edf3writerTb4b4b4)
Te6edf3cacheManagerTb4b4b4.Te6edf3downloadAreaAsyncTb4b4b4(
Te6edf3contextTb4b4b4,
Te6edf3boundingBoxTb4b4b4,
Te6edf3zoomLevelMinTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3zoomLevelMaxTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3cacheManagerCallbackTb4b4b4(
Te6edf3onTaskComplete Tff7b72= Tb4b4b4{
Te6edf3scopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3contextTb4b4b4.Te6edf3showToastTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_download_completeTb4b4b4) Tb4b4b4}
Te6edf3writerTb4b4b4.Te6edf3onDetachTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3onTaskFailed Tff7b72= Tb4b4b4{ Te6edf3errors Tff7b72-Tff7b72>
Te6edf3scopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3contextTb4b4b4.Te6edf3showToastTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_download_errorsTb4b4b4, Te6edf3errorsTb4b4b4) Tb4b4b4}
Te6edf3writerTb4b4b4.Te6edf3onDetachTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3TileSourcePolicyExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffTile source does not allow archiving: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff" Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffTile source exception: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff" Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3ScaffoldTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4,
Te6edf3floatingActionButton Tff7b72= Tb4b4b4{
Te6edf3DownloadButtonTb4b4b4(Te6edf3showDownloadButton Tff7b72&Tff7b72& Te6edf3downloadRegionBoundingBox Tff7b72=Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3geofenceBoxDraft Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3showCacheManagerDialog Tff7b72= Tff7b72true
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3innerPadding Tff7b72-Tff7b72>
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3innerPaddingTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3AndroidViewTb4b4b4(
Te6edf3factory Tff7b72= Tb4b4b4{
Te6edf3mapTb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3setDestroyModeTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3addMapListenerTb4b4b4(Te6edf3boxOverlayListenerTb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3update Tff7b72= Tb4b4b4{ Te6edf3mapView Tff7b72-Tff7b72>
Te6edf3withTb4b4b4(Te6edf3mapViewTb4b4b4) Tb4b4b4{
Te6edf3updateMarkersTb4b4b4(
Te6edf3onNodesChangedTb4b4b4(Te6edf3nodesTb4b4b4)Tb4b4b4,
Te6edf3onWaypointChangedTb4b4b4(Te6edf3waypointsTb4b4b4.Te6edf3valuesTb4b4b4, Te6edf3selectedWaypointIdTb4b4b4)Tb4b4b4,
Te6edf3buildGeofenceOverlaysTb4b4b4(Te6edf3waypointsTb4b4b4.Te6edf3valuesTb4b4b4)Tb4b4b4,
Te6edf3nodeClustererTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3mapViewTb4b4b4.Te6edf3drawOverlaysTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4, T8b949e// Renamed map to mapView to avoid conflict
Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3geofenceBoxDraft Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3GeofenceBoxAuthoringBarTb4b4b4(
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Tff7b72val Te6edf3draft Tff7b72= Te6edf3geofenceBoxDraft
Tff7b72val Te6edf3bb Tff7b72= Te6edf3geofenceBoxBoundingBox
Tff7b72if Tb4b4b4(Te6edf3draft Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3bb Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3showEditWaypointDialog Tff7b72= Te6edf3draftTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3bounding_box Tff7b72= Te6edf3bbTb4b4b4.Te6edf3toProtoBoundingBoxTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3showEditWaypointDialog Tff7b72= Te6edf3draft
Tb4b4b4}
Te6edf3geofenceBoxDraft Tff7b72= Tff7b72null
Te6edf3geofenceBoxBoundingBox Tff7b72= Tff7b72null
Te6edf3mapTb4b4b4.Te6edf3overlaysTb4b4b4.Te6edf3removeAll Tb4b4b4{ Tffa657it Tff7b72is Te6edf3Polygon Tff7b72&Tff7b72& Tffa657it Tff7b72!is Te6edf3GeofenceOverlayPolygon Tb4b4b4}
Te6edf3mapTb4b4b4.Te6edf3invalidateTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3onCancel Tff7b72= Tb4b4b4{
Tff7b72val Te6edf3draft Tff7b72= Te6edf3geofenceBoxDraft
Te6edf3geofenceBoxDraft Tff7b72= Tff7b72null
Te6edf3geofenceBoxBoundingBox Tff7b72= Tff7b72null
Te6edf3mapTb4b4b4.Te6edf3overlaysTb4b4b4.Te6edf3removeAll Tb4b4b4{ Tffa657it Tff7b72is Te6edf3Polygon Tff7b72&Tff7b72& Tffa657it Tff7b72!is Te6edf3GeofenceOverlayPolygon Tb4b4b4}
Te6edf3mapTb4b4b4.Te6edf3invalidateTb4b4b4(Tb4b4b4)
Te6edf3showEditWaypointDialog Tff7b72= Te6edf3draft
Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3alignTb4b4b4(Te6edf3AlignmentTb4b4b4.Te6edf3BottomCenterTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3downloadRegionBoundingBox Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3CacheLayoutTb4b4b4(
Te6edf3cacheEstimate Tff7b72= Te6edf3cacheEstimateTb4b4b4,
Te6edf3onExecuteJob Tff7b72= Tb4b4b4{ Te6edf3startDownloadTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onCancelDownload Tff7b72= Tb4b4b4{
Te6edf3downloadRegionBoundingBox Tff7b72= Tff7b72null
Te6edf3mapTb4b4b4.Te6edf3overlaysTb4b4b4.Te6edf3removeAll Tb4b4b4{ Tffa657it Tff7b72is Te6edf3Polygon Tff7b72&Tff7b72& Tffa657it Tff7b72!is Te6edf3GeofenceOverlayPolygon Tb4b4b4}
Te6edf3mapTb4b4b4.Te6edf3invalidateTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3alignTb4b4b4(Te6edf3AlignmentTb4b4b4.Te6edf3BottomCenterTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3MapControlsOverlayTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3alignTb4b4b4(Te6edf3AlignmentTb4b4b4.Te6edf3TopCenterTb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3top Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3onToggleFilterMenu Tff7b72= Tb4b4b4{ Te6edf3mapFilterExpanded Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4,
Te6edf3filterDropdownContent Tff7b72= Tb4b4b4{
Te6edf3FdroidMainMapFilterDropdownTb4b4b4(
Te6edf3expanded Tff7b72= Te6edf3mapFilterExpandedTb4b4b4,
Te6edf3onDismissRequest Tff7b72= Tb4b4b4{ Te6edf3mapFilterExpanded Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Te6edf3mapFilterState Tff7b72= Te6edf3mapFilterStateTb4b4b4,
Te6edf3mapViewModel Tff7b72= Te6edf3mapViewModelTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3mapTypeContent Tff7b72= Tb4b4b4{
Te6edf3MapButtonTb4b4b4(
Te6edf3icon Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3MapTb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_style_selectionTb4b4b4)Tb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3showMapStyleDialog Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3layersContent Tff7b72= Tb4b4b4{
Te6edf3MapButtonTb4b4b4(
Te6edf3icon Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3LayersTb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3manage_map_layersTb4b4b4)Tb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3showLayersBottomSheet Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
T8b949e// Hands node/channel-derived params to the hosted Site Planner and imports the returned coverage.
Te6edf3onSitePlannerClick Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3sitePlannerAvailableTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tb4b4b4{ Te6edf3sitePlannerInitial Tff7b72= Te6edf3ourNodeInfoTb4b4b4.Te6edf3toSitePlannerParamsTb4b4b4(Te6edf3channelSetTb4b4b4) Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Te6edf3isLocationTrackingEnabled Tff7b72= Te6edf3myLocationOverlay Tff7b72!Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3onToggleLocationTracking Tff7b72= Tb4b4b4{
Tff7b72when Tb4b4b4{
Te6edf3locationPermissionTb4b4b4.Te6edf3isGranted Tff7b72-Tff7b72> Te6edf3mapTb4b4b4.Te6edf3toggleMyLocationTb4b4b4(Tb4b4b4)
T8b949e// Permanently denied: the system won't prompt again, so send the user to settings.
Te6edf3locationPermissionTb4b4b4.Te6edf3status Tff7b72=Tff7b72= Te6edf3PermissionStatusTb4b4b4.Te6edf3PERMANENTLY_DENIED Tff7b72-Tff7b72>
Te6edf3locationPermissionTb4b4b4.Te6edf3openAppSettingsTb4b4b4(Tb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3triggerLocationToggleAfterPermission Tff7b72= Tff7b72true
Te6edf3locationPermissionTb4b4b4.Te6edf3requestTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showMapStyleDialogTb4b4b4) Tb4b4b4{
Te6edf3MapStyleDialogTb4b4b4(
Te6edf3selectedMapStyle Tff7b72= Te6edf3mapViewModelTb4b4b4.Te6edf3mapStyleIdTb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showMapStyleDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Te6edf3onSelectMapStyle Tff7b72= Tb4b4b4{
Te6edf3mapViewModelTb4b4b4.Te6edf3mapStyleId Tff7b72= Tffa657it
Te6edf3mapTb4b4b4.Te6edf3setTileSourceTb4b4b4(Te6edf3loadOnlineTileSourceBaseTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showLayersBottomSheetTb4b4b4) Tb4b4b4{
Te6edf3ModalBottomSheetTb4b4b4(Te6edf3onDismissRequest Tff7b72= Tb4b4b4{ Te6edf3showLayersBottomSheet Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3CustomMapLayersSheetTb4b4b4(
Te6edf3mapLayers Tff7b72= Te6edf3mapLayersTb4b4b4,
Te6edf3onToggleVisibility Tff7b72= Te6edf3mapViewModelTff7b72::Te6edf3toggleLayerVisibilityTb4b4b4,
Te6edf3onRemoveLayer Tff7b72= Te6edf3mapViewModelTff7b72::Te6edf3removeMapLayerTb4b4b4,
Te6edf3onAddLayerClicked Tff7b72= Te6edf3onAddLayerClickedTb4b4b4,
Te6edf3onRefreshLayer Tff7b72= Te6edf3mapViewModelTff7b72::Te6edf3refreshMapLayerTb4b4b4,
Te6edf3onAddNetworkLayer Tff7b72= Tb4b4b4{ Te6edf3nameTb4b4b4, Te6edf3url Tff7b72-Tff7b72> Te6edf3mapViewModelTb4b4b4.Te6edf3addNetworkMapLayerTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3urlTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e// Site Planner deep link from a node's detail screen — open the estimate dialog prefilled with that node.
Tff7b72val Te6edf3sitePlannerRequest Tff7b72by Te6edf3mapViewModelTb4b4b4.Te6edf3sitePlannerRequestTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Te6edf3LaunchedEffectTb4b4b4(Te6edf3sitePlannerRequestTb4b4b4) Tb4b4b4{
Te6edf3sitePlannerRequestTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3node Tff7b72-Tff7b72>
Te6edf3sitePlannerInitial Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3toSitePlannerParamsTb4b4b4(Te6edf3channelSetTb4b4b4)
Te6edf3mapViewModelTb4b4b4.Te6edf3consumeSitePlannerRequestTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3sitePlannerInitialTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3initial Tff7b72-Tff7b72>
Te6edf3SitePlannerHostTb4b4b4(
Te6edf3initialParams Tff7b72= Te6edf3initialTb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3sitePlannerInitial Tff7b72= Tff7b72null Tb4b4b4}Tb4b4b4,
Te6edf3onImport Tff7b72= Tb4b4b4{ Te6edf3nameTb4b4b4, Te6edf3geoJsonTb4b4b4, Te6edf3latitudeTb4b4b4, Te6edf3longitude Tff7b72-Tff7b72>
Te6edf3mapViewModelTb4b4b4.Te6edf3addGeoJsonLayerTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3geoJsonTb4b4b4)
T8b949e// Recenter on the estimate's transmitter so the freshly-imported coverage is on-screen.
Te6edf3mapTb4b4b4.Te6edf3controllerTb4b4b4.Te6edf3animateToTb4b4b4(Te6edf3GeoPointTb4b4b4(Te6edf3latitudeTb4b4b4, Te6edf3longitudeTb4b4b4)Tb4b4b4)
Tb4b4b4}Tb4b4b4,
T8b949e// OSMdroid GPS fix (only when tracking is active + permission granted); no Play-services location on
T8b949e// F-Droid.
Te6edf3onRequestCurrentLocation Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3locationPermissionTb4b4b4.Te6edf3isGrantedTb4b4b4) Tb4b4b4{
Tb4b4b4{ Te6edf3myLocationOverlayTff7b72?.Te6edf3myLocationTff7b72?.Te6edf3let Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3latitude Te6edf3to Tffa657itTb4b4b4.Te6edf3longitude Tb4b4b4} Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Te6edf3onUseNodeLocation Tff7b72=
Te6edf3ourNodeInfoTff7b72?.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3validPosition Tff7b72!Tff7b72= Tff7b72null Tb4b4b4}Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3node Tff7b72-Tff7b72> Tb4b4b4{ Te6edf3nodeTb4b4b4.Te6edf3latitude Te6edf3to Te6edf3nodeTb4b4b4.Te6edf3longitude Tb4b4b4} Tb4b4b4}Tb4b4b4,
Te6edf3onUseMapCenter Tff7b72= Tb4b4b4{ Te6edf3mapTb4b4b4.Te6edf3mapCenterTb4b4b4.Te6edf3let Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3latitude Te6edf3to Tffa657itTb4b4b4.Te6edf3longitude Tb4b4b4} Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showCacheManagerDialogTb4b4b4) Tb4b4b4{
Te6edf3CacheManagerDialogTb4b4b4(
Te6edf3onClickOption Tff7b72= Tb4b4b4{ Te6edf3option Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3optionTb4b4b4) Tb4b4b4{
Te6edf3CacheManagerOptionTb4b4b4.Te6edf3CurrentCacheSize Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3scopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3contextTb4b4b4.Te6edf3showToastTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3calculatingTb4b4b4) Tb4b4b4}
Te6edf3showCurrentCacheInfo Tff7b72= Tff7b72true
Tb4b4b4}
Te6edf3CacheManagerOptionTb4b4b4.Te6edf3DownloadRegion Tff7b72-Tff7b72> Te6edf3mapTb4b4b4.Te6edf3generateBoxOverlayTb4b4b4(Tb4b4b4)
Te6edf3CacheManagerOptionTb4b4b4.Te6edf3ClearTiles Tff7b72-Tff7b72> Te6edf3showPurgeTileSourceDialog Tff7b72= Tff7b72true
Te6edf3CacheManagerOptionTb4b4b4.Te6edf3Cancel Tff7b72-Tff7b72> Tffa657Unit
Tb4b4b4}
Te6edf3showCacheManagerDialog Tff7b72= Tff7b72false
Tb4b4b4}Tb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showCacheManagerDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showCurrentCacheInfoTb4b4b4) Tb4b4b4{
Te6edf3CacheInfoDialogTb4b4b4(Te6edf3mapView Tff7b72= Te6edf3mapTb4b4b4, Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showCurrentCacheInfo Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showPurgeTileSourceDialogTb4b4b4) Tb4b4b4{
Te6edf3PurgeTileSourceDialogTb4b4b4(Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showPurgeTileSourceDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showEditWaypointDialog Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3EditWaypointDialogTb4b4b4(
Te6edf3waypoint Tff7b72= Te6edf3showEditWaypointDialog Tff7b72?: Tff7b72returnTb4b4b4, T8b949e// Safe call
Te6edf3displayUnits Tff7b72= Te6edf3displayUnitsTb4b4b4,
Te6edf3myNodeNum Tff7b72= Te6edf3mapViewModelTb4b4b4.Te6edf3myNodeNumTb4b4b4,
Te6edf3onSend Tff7b72= Tb4b4b4{ Te6edf3waypoint Tff7b72-Tff7b72>
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffUser clicked send waypoint Tffd700${Te6edf3waypointTb4b4b4.Te6edf3idTffd700}Ta5d6ff" Tb4b4b4}
Te6edf3showEditWaypointDialog Tff7b72= Tff7b72null
Tff7b72val Te6edf3newId Tff7b72= Tff7b72if Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3id Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Te6edf3mapViewModelTb4b4b4.Te6edf3generatePacketIdTb4b4b4(Tb4b4b4) Tff7b72else Te6edf3waypointTb4b4b4.Te6edf3id
Tff7b72val Te6edf3newName Tff7b72= Tff7b72if Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3isNullOrEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Ta5d6ff"Ta5d6ffDropped PinTa5d6ff" Tff7b72else Te6edf3waypointTb4b4b4.Te6edf3name
Tff7b72val Te6edf3newExpire Tff7b72= Tff7b72if Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3expire Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tffa657IntTb4b4b4.Te6edf3MAX_VALUE Tff7b72else Te6edf3waypointTb4b4b4.Te6edf3expire
Tff7b72val Te6edf3newIcon Tff7b72= Te6edf3waypointTb4b4b4.Te6edf3iconTb4b4b4.Te6edf3waypointIconOrDefaultTb4b4b4(Tb4b4b4)
T8b949e// locked_to is already resolved by the editor (our node number when locked, 0 when not).
Te6edf3mapViewModelTb4b4b4.Te6edf3sendWaypointTb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3id Tff7b72= Te6edf3newIdTb4b4b4, Te6edf3name Tff7b72= Te6edf3newNameTb4b4b4, Te6edf3expire Tff7b72= Te6edf3newExpireTb4b4b4, Te6edf3icon Tff7b72= Te6edf3newIconTb4b4b4)Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3onDelete Tff7b72= Tb4b4b4{ Te6edf3waypoint Tff7b72-Tff7b72>
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffUser clicked delete waypoint Tffd700${Te6edf3waypointTb4b4b4.Te6edf3idTffd700}Ta5d6ff" Tb4b4b4}
Te6edf3showEditWaypointDialog Tff7b72= Tff7b72null
Te6edf3showDeleteWaypointDialog Tff7b72= Te6edf3waypoint
Tb4b4b4}Tb4b4b4,
Te6edf3onDismissRequest Tff7b72= Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffUser clicked cancel marker edit dialogTa5d6ff" Tb4b4b4}
Te6edf3showEditWaypointDialog Tff7b72= Tff7b72null
Tb4b4b4}Tb4b4b4,
Te6edf3onBeginBoxAuthoring Tff7b72= Tb4b4b4{ Te6edf3draft Tff7b72-Tff7b72>
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffUser began geofence box authoring for waypoint Tffd700${Te6edf3draftTb4b4b4.Te6edf3idTffd700}Ta5d6ff" Tb4b4b4}
Te6edf3showEditWaypointDialog Tff7b72= Tff7b72null
Te6edf3geofenceBoxDraft Tff7b72= Te6edf3draft
Te6edf3mapTb4b4b4.Te6edf3generateGeofenceBoxOverlayTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3showGeofenceInfoDialogTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3waypoint Tff7b72-Tff7b72>
Tff7b72val Te6edf3optIns Tff7b72by Te6edf3mapViewModelTb4b4b4.Te6edf3geofenceAlertOptInsTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Te6edf3WaypointInfoDialogTb4b4b4(
Te6edf3waypoint Tff7b72= Te6edf3waypointTb4b4b4,
Te6edf3displayUnits Tff7b72= Te6edf3displayUnitsTb4b4b4,
Te6edf3alertsEnabled Tff7b72= Te6edf3waypointTb4b4b4.Te6edf3id Tff7b72in Te6edf3optInsTb4b4b4,
Te6edf3onToggleAlerts Tff7b72= Tb4b4b4{ Te6edf3mapViewModelTb4b4b4.Te6edf3setGeofenceAlertOptInTb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3idTb4b4b4, Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onDismissRequest Tff7b72= Tb4b4b4{ Te6edf3showGeofenceInfoDialog Tff7b72= Tff7b72null Tb4b4b4}Tb4b4b4,
T8b949e// Unlocked foreign geofences can still be edited/re-broadcast (only while connected, since editing means
T8b949e// re-sending); locked ones stay read-only.
Te6edf3onEdit Tff7b72=
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3waypointTb4b4b4.Te6edf3isLocked Tff7b72&Tff7b72& Te6edf3isConnectedTb4b4b4) Tb4b4b4{
Tb4b4b4{
Te6edf3showGeofenceInfoDialog Tff7b72= Tff7b72null
Te6edf3showEditWaypointDialog Tff7b72= Te6edf3waypoint
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showDeleteWaypointDialog Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3waypoint Tff7b72= Te6edf3showDeleteWaypointDialog Tff7b72?: Tff7b72return
Tff7b72val Te6edf3canDeleteForEveryone Tff7b72= Te6edf3waypointTb4b4b4.Te6edf3isModifiableByTb4b4b4(Te6edf3mapViewModelTb4b4b4.Te6edf3myNodeNumTb4b4b4) Tff7b72&Tff7b72& Te6edf3isConnected
Te6edf3androidxTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3material3Tb4b4b4.Te6edf3AlertDialogTb4b4b4(
Te6edf3onDismissRequest Tff7b72= Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffUser canceled marker delete dialogTa5d6ff" Tb4b4b4}
Te6edf3showDeleteWaypointDialog Tff7b72= Tff7b72null
Tb4b4b4}Tb4b4b4,
Te6edf3title Tff7b72= Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3waypoint_deleteTb4b4b4)Tb4b4b4) Tb4b4b4}Tb4b4b4,
T8b949e// Both deletes are confirmations; Cancel is the dismiss action (mirrors the old neutral button).
Te6edf3confirmButton Tff7b72= Tb4b4b4{
Te6edf3Column Tb4b4b4{
Te6edf3TextButtonTb4b4b4(
Te6edf3onClick Tff7b72= Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffUser deleted waypoint Tffd700${Te6edf3waypointTb4b4b4.Te6edf3idTffd700}Ta5d6ff for meTa5d6ff" Tb4b4b4}
Te6edf3mapViewModelTb4b4b4.Te6edf3deleteWaypointTb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3idTb4b4b4)
Te6edf3showDeleteWaypointDialog Tff7b72= Tff7b72null
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3delete_for_meTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3canDeleteForEveryoneTb4b4b4) Tb4b4b4{
Te6edf3TextButtonTb4b4b4(
Te6edf3onClick Tff7b72= Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffUser deleted waypoint Tffd700${Te6edf3waypointTb4b4b4.Te6edf3idTffd700}Ta5d6ff for everyoneTa5d6ff" Tb4b4b4}
Te6edf3mapViewModelTb4b4b4.Te6edf3sendWaypointTb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3expire Tff7b72= T79c0ff1Tb4b4b4)Tb4b4b4)
Te6edf3mapViewModelTb4b4b4.Te6edf3deleteWaypointTb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3idTb4b4b4)
Te6edf3showDeleteWaypointDialog Tff7b72= Tff7b72null
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3delete_for_everyoneTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3dismissButton Tff7b72= Tb4b4b4{
Te6edf3TextButtonTb4b4b4(
Te6edf3onClick Tff7b72= Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffUser canceled marker delete dialogTa5d6ff" Tb4b4b4}
Te6edf3showDeleteWaypointDialog Tff7b72= Tff7b72null
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3cancelTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e/** F-Droid main map filter dropdown — favorites, waypoints, precision circle, and last-heard time filter slider. */
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffFdroidMainMapFilterDropdownTb4b4b4(
Te6edf3expandedTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3onDismissRequestTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3mapFilterStateTb4b4b4: Te6edf3MapFilterStateTb4b4b4,
Te6edf3mapViewModelTb4b4b4: Te6edf3MapViewModelTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ExpressiveApiTff7b72::Te6edf3classTb4b4b4)
Te6edf3DropdownMenuTb4b4b4(
Te6edf3expanded Tff7b72= Te6edf3expandedTb4b4b4,
Te6edf3onDismissRequest Tff7b72= Te6edf3onDismissRequestTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3backgroundTb4b4b4(Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3surfaceTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3DropdownMenuGroupTb4b4b4(Te6edf3shapes Tff7b72= Te6edf3MenuDefaultsTb4b4b4.Te6edf3groupShapesTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3DropdownMenuItemTb4b4b4(
Te6edf3text Tff7b72= Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3FavoriteTb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3end Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3tint Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3only_favoritesTb4b4b4)Tb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4)
Te6edf3CheckboxTb4b4b4(
Te6edf3checked Tff7b72= Te6edf3mapFilterStateTb4b4b4.Te6edf3onlyFavoritesTb4b4b4,
Te6edf3onCheckedChange Tff7b72= Tb4b4b4{ Te6edf3mapViewModelTb4b4b4.Te6edf3toggleOnlyFavoritesTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3start Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3mapViewModelTb4b4b4.Te6edf3toggleOnlyFavoritesTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3DropdownMenuItemTb4b4b4(
Te6edf3text Tff7b72= Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3PinDropTb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3end Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3tint Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3show_waypointsTb4b4b4)Tb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4)
Te6edf3CheckboxTb4b4b4(
Te6edf3checked Tff7b72= Te6edf3mapFilterStateTb4b4b4.Te6edf3showWaypointsTb4b4b4,
Te6edf3onCheckedChange Tff7b72= Tb4b4b4{ Te6edf3mapViewModelTb4b4b4.Te6edf3toggleShowWaypointsOnMapTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3start Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3mapViewModelTb4b4b4.Te6edf3toggleShowWaypointsOnMapTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3DropdownMenuItemTb4b4b4(
Te6edf3text Tff7b72= Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3LensTb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3end Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3tint Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3show_precision_circleTb4b4b4)Tb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4)
Te6edf3CheckboxTb4b4b4(
Te6edf3checked Tff7b72= Te6edf3mapFilterStateTb4b4b4.Te6edf3showPrecisionCircleTb4b4b4,
Te6edf3onCheckedChange Tff7b72= Tb4b4b4{ Te6edf3mapViewModelTb4b4b4.Te6edf3toggleShowPrecisionCircleOnMapTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3start Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3mapViewModelTb4b4b4.Te6edf3toggleShowPrecisionCircleOnMapTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4, Te6edf3vertical Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3filterOptions Tff7b72= Te6edf3LastHeardFilterTb4b4b4.Te6edf3entries
Tff7b72val Te6edf3selectedIndex Tff7b72= Te6edf3filterOptionsTb4b4b4.Te6edf3indexOfTb4b4b4(Te6edf3mapFilterStateTb4b4b4.Te6edf3lastHeardFilterTb4b4b4)
Tff7b72var Te6edf3sliderPosition Tff7b72by Te6edf3rememberTb4b4b4(Te6edf3selectedIndexTb4b4b4) Tb4b4b4{ Te6edf3mutableFloatStateOfTb4b4b4(Te6edf3selectedIndexTb4b4b4.Te6edf3toFloatTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72=
Te6edf3stringResourceTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3last_heard_filter_labelTb4b4b4,
Te6edf3stringResourceTb4b4b4(Te6edf3mapFilterStateTb4b4b4.Te6edf3lastHeardFilterTb4b4b4.Te6edf3labelTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4,
Tb4b4b4)
Te6edf3SliderTb4b4b4(
Te6edf3value Tff7b72= Te6edf3sliderPositionTb4b4b4,
Te6edf3onValueChange Tff7b72= Tb4b4b4{ Te6edf3sliderPosition Tff7b72= Tffa657it Tb4b4b4}Tb4b4b4,
Te6edf3onValueChangeFinished Tff7b72= Tb4b4b4{
Tff7b72val Te6edf3newIndex Tff7b72= Te6edf3sliderPositionTb4b4b4.Te6edf3roundToIntTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3coerceInTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3filterOptionsTb4b4b4.Te6edf3size Tff7b72- T79c0ff1Tb4b4b4)
Te6edf3mapViewModelTb4b4b4.Te6edf3setLastHeardFilterTb4b4b4(Te6edf3filterOptionsTff7b72[Te6edf3newIndexTff7b72]Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3valueRange Tff7b72= T79c0ff0fTb4b4b4.Tb4b4b4.Tb4b4b4(Te6edf3filterOptionsTb4b4b4.Te6edf3size Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4.Te6edf3toFloatTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3steps Tff7b72= Te6edf3filterOptionsTb4b4b4.Te6edf3size Tff7b72- T79c0ff2Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffMapStyleDialogTb4b4b4(Te6edf3selectedMapStyleTb4b4b4: Tffa657IntTb4b4b4, Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3onSelectMapStyleTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3selected Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3mutableIntStateOfTb4b4b4(Te6edf3selectedMapStyleTb4b4b4) Tb4b4b4}
Te6edf3MapsDialogTb4b4b4(Te6edf3onDismiss Tff7b72= Te6edf3onDismissTb4b4b4) Tb4b4b4{
Te6edf3CustomTileSourceTb4b4b4.Te6edf3mTileSourcesTb4b4b4.Te6edf3valuesTb4b4b4.Te6edf3forEachIndexed Tb4b4b4{ Te6edf3indexTb4b4b4, Te6edf3style Tff7b72-Tff7b72>
Te6edf3ListItemTb4b4b4(
Te6edf3text Tff7b72= Te6edf3styleTb4b4b4,
Te6edf3trailingIcon Tff7b72= Tff7b72if Tb4b4b4(Te6edf3index Tff7b72=Tff7b72= Te6edf3selectedTb4b4b4.Te6edf3intValueTb4b4b4) Te6edf3MeshtasticIconsTb4b4b4.Te6edf3Check Tff7b72else Tff7b72nullTb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{
Te6edf3selectedTb4b4b4.Te6edf3intValue Tff7b72= Te6edf3index
Te6edf3onSelectMapStyleTb4b4b4(Te6edf3indexTb4b4b4)
Te6edf3onDismissTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72enum Tff7b72class T56d364CacheManagerOptionTb4b4b4(Tff7b72val Te6edf3labelTb4b4b4: Te6edf3StringResourceTb4b4b4) Tb4b4b4{
Te6edf3CurrentCacheSizeTb4b4b4(Te6edf3label Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_cache_sizeTb4b4b4)Tb4b4b4,
Te6edf3DownloadRegionTb4b4b4(Te6edf3label Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_download_regionTb4b4b4)Tb4b4b4,
Te6edf3ClearTilesTb4b4b4(Te6edf3label Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_clear_tilesTb4b4b4)Tb4b4b4,
Te6edf3CancelTb4b4b4(Te6edf3label Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3cancelTb4b4b4)Tb4b4b4,
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffCacheManagerDialogTb4b4b4(Te6edf3onClickOptionTb4b4b4: Tb4b4b4(Te6edf3CacheManagerOptionTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3MapsDialogTb4b4b4(Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_managerTb4b4b4)Tb4b4b4, Te6edf3onDismiss Tff7b72= Te6edf3onDismissTb4b4b4) Tb4b4b4{
Te6edf3CacheManagerOptionTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3option Tff7b72-Tff7b72>
Te6edf3ListItemTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3optionTb4b4b4.Te6edf3labelTb4b4b4)Tb4b4b4, Te6edf3trailingIcon Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3onClickOptionTb4b4b4(Te6edf3optionTb4b4b4)
Te6edf3onDismissTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffCacheInfoDialogTb4b4b4(Te6edf3mapViewTb4b4b4: Te6edf3MapViewTb4b4b4, Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3cacheCapacityTb4b4b4, Te6edf3currentCacheUsageTb4b4b4) Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3mapViewTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3cacheManager Tff7b72= Te6edf3CacheManagerTb4b4b4(Te6edf3mapViewTb4b4b4)
Te6edf3cacheManagerTb4b4b4.Te6edf3cacheCapacityTb4b4b4(Tb4b4b4) Te6edf3to Te6edf3cacheManagerTb4b4b4.Te6edf3currentCacheUsageTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3MapsDialogTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_cache_managerTb4b4b4)Tb4b4b4,
Te6edf3onDismiss Tff7b72= Te6edf3onDismissTb4b4b4,
Te6edf3negativeButton Tff7b72= Tb4b4b4{ Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onDismissTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3closeTb4b4b4)Tb4b4b4) Tb4b4b4} Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3capacityMb Tff7b72= Te6edf3cacheCapacity Tff7b72/ Tb4b4b4(T79c0ff1T79c0ff0T79c0ff2T79c0ff4 Tff7b72* T79c0ff1T79c0ff0T79c0ff2T79c0ff4Tb4b4b4)
Tff7b72val Te6edf3usageMb Tff7b72= Te6edf3currentCacheUsage Tff7b72/ Tb4b4b4(T79c0ff1T79c0ff0T79c0ff2T79c0ff4 Tff7b72* T79c0ff1T79c0ff0T79c0ff2T79c0ff4Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_cache_infoTb4b4b4, Te6edf3capacityMbTb4b4b4, Te6edf3usageMbTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffPurgeTileSourceDialogTb4b4b4(Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3scope Tff7b72= Te6edf3rememberCoroutineScopeTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3context Tff7b72= Te6edf3LocalContextTb4b4b4.Te6edf3current
Tff7b72val Te6edf3cache Tff7b72= Te6edf3SqlTileWriterExtTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3sourceList Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3derivedStateOf Tb4b4b4{ Te6edf3cacheTb4b4b4.Te6edf3sourcesTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3source Tff7b72as Tffa657String Tb4b4b4} Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3selected Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3mutableStateListOfTff7b72<Tffa657IntTff7b72>Tb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3MapsDialogTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_tile_sourceTb4b4b4)Tb4b4b4,
Te6edf3positiveButton Tff7b72= Tb4b4b4{
Te6edf3TextButtonTb4b4b4(
Te6edf3enabled Tff7b72= Te6edf3selectedTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{
Te6edf3selectedTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3selectedIndex Tff7b72-Tff7b72>
Tff7b72val Te6edf3source Tff7b72= Te6edf3sourceListTff7b72[Te6edf3selectedIndexTff7b72]
Te6edf3scopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3contextTb4b4b4.Te6edf3showToastTb4b4b4(
Tff7b72if Tb4b4b4(Te6edf3cacheTb4b4b4.Te6edf3purgeCacheTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_purge_successTb4b4b4, Te6edf3sourceTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_purge_failTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3onDismissTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3clearTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3negativeButton Tff7b72= Tb4b4b4{ Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onDismissTb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3cancelTb4b4b4)Tb4b4b4) Tb4b4b4} Tb4b4b4}Tb4b4b4,
Te6edf3onDismiss Tff7b72= Te6edf3onDismissTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3sourceListTb4b4b4.Te6edf3forEachIndexed Tb4b4b4{ Te6edf3indexTb4b4b4, Te6edf3source Tff7b72-Tff7b72>
Tff7b72val Te6edf3isSelected Tff7b72= Te6edf3selectedTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3indexTb4b4b4)
Te6edf3BasicListItemTb4b4b4(
Te6edf3text Tff7b72= Te6edf3sourceTb4b4b4,
Te6edf3trailingContent Tff7b72= Tb4b4b4{ Te6edf3CheckboxTb4b4b4(Te6edf3checked Tff7b72= Te6edf3isSelectedTb4b4b4, Te6edf3onCheckedChange Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isSelectedTb4b4b4) Tb4b4b4{
Te6edf3selectedTb4b4b4.Te6edf3removeTb4b4b4(Te6edf3indexTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3selectedTb4b4b4.Te6edf3addTb4b4b4(Te6edf3indexTb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ApiTff7b72::Te6edf3classTb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffMapsDialogTb4b4b4(
Te6edf3titleTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3positiveButtonTb4b4b4: Tb4b4b4(Tf0883e@Composable Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3negativeButtonTb4b4b4: Tb4b4b4(Tf0883e@Composable Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3contentTb4b4b4: Tf0883e@Composable Te6edf3ColumnScopeTb4b4b4.Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3BasicAlertDialogTb4b4b4(Te6edf3onDismissRequest Tff7b72= Te6edf3onDismissTb4b4b4) Tb4b4b4{
Te6edf3SurfaceTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3wrapContentWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3wrapContentHeightTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3shape Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3shapesTb4b4b4.Te6edf3largeTb4b4b4,
Te6edf3color Tff7b72= Te6edf3AlertDialogDefaultsTb4b4b4.Te6edf3containerColorTb4b4b4,
Te6edf3tonalElevation Tff7b72= Te6edf3AlertDialogDefaultsTb4b4b4.Te6edf3TonalElevationTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3Column Tb4b4b4{
Te6edf3titleTff7b72?.Te6edf3let Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3start Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4, Te6edf3top Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4, Te6edf3end Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4, Te6edf3bottom Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3text Tff7b72= Tffa657itTb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleLargeTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3verticalScrollTb4b4b4(Te6edf3rememberScrollStateTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3contentTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3positiveButton Tff7b72!Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3negativeButton Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3alignTb4b4b4(Te6edf3AlignmentTb4b4b4.Te6edf3EndTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3positiveButtonTff7b72?.Te6edf3invokeTb4b4b4(Tb4b4b4)
Te6edf3negativeButtonTff7b72?.Te6edf3invokeTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72const Tff7b72val Te6edf3WAYPOINT_ZOOM Tff7b72= T79c0ff1T79c0ff5.0
T8b949e// Geofence / authoring rectangle styling (orange) for the imperative OSMDroid Polygon paints (android.graphics ints).
Tff7b72private Tff7b72const Tff7b72val Te6edf3GEOFENCE_OVERLAY_COLOR Tff7b72= T79c0ff0Te6edf3xFFFF9800Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72const Tff7b72val Te6edf3GEOFENCE_FILL_COLOR Tff7b72= T79c0ff0Te6edf3x1FFF9800 T8b949e// ~12% alpha orange
Tff7b72private Tff7b72const Tff7b72val Te6edf3GEOFENCE_STROKE_WIDTH_PX Tff7b72= T79c0ff4f
Tff7b72private Tff7b72const Tff7b72val Te6edf3GEOFENCE_BOX_ZOOM_FACTOR Tff7b72= T79c0ff1.3
T8b949e/** Converts an OSMDroid [BoundingBox] (decimal degrees) to a proto [ProtoBoundingBox] (degrees ×1e7). */
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Te6edf3BoundingBoxTb4b4b4.Td2a8fftoProtoBoundingBoxTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3ProtoBoundingBox Tff7b72= Te6edf3ProtoBoundingBoxTb4b4b4(
Te6edf3longitude_west_i Tff7b72= Tb4b4b4(Te6edf3lonWest Tff7b72* T79c0ff1Te6edf3e7Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3latitude_south_i Tff7b72= Tb4b4b4(Te6edf3latSouth Tff7b72* T79c0ff1Te6edf3e7Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3longitude_east_i Tff7b72= Tb4b4b4(Te6edf3lonEast Tff7b72* T79c0ff1Te6edf3e7Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3latitude_north_i Tff7b72= Tb4b4b4(Te6edf3latNorth Tff7b72* T79c0ff1Te6edf3e7Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e/** Bottom bar shown while the user positions the geofence rectangle: confirm applies it, cancel re-opens the editor. */
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffGeofenceBoxAuthoringBarTb4b4b4(Te6edf3onConfirmTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3onCancelTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4) Tb4b4b4{
Te6edf3CardTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4, Te6edf3vertical Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3geofence_box_author_hint_viewportTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onCancelTb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3cancelTb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3ButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onConfirmTb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3geofence_box_author_confirmTb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.29s